package beans.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

/**
 * 简单提供了方法的原型，具体使用还要结合业务。
 * 
 * @author Jert
 * 
 */
public class SocketLongLived
{

	private static final int BUFFER_SIZE = 65535;

	public static void main(String[] args)
	{

	}

	/**
	 * 一次性全部读取。
	 * 
	 * 优点:是读取速度快，且不用被超时所扰;<br/>
	 * 缺陷:只能读取一定量的字节，虽然BufferedReader的构造方法提供了设置缓冲区大小的功能，但是不管设多大，都只能读取一定量的字节;<br/>
	 * 据项目中的情况来看，是65536个。 如果响应消息有几MB的话，这种方法是肯定不行的。但是如果读取的消息很小，在65536个字节以内，则可以使用。
	 * 
	 * @param is
	 */
	public static void getReaderOfOne(InputStream is)
	{
		BufferedReader reader = new BufferedReader(new InputStreamReader(is), BUFFER_SIZE);
		char[] context = new char[BUFFER_SIZE];
		try
		{
			int l = reader.read(context);
			String s = new String(context, 0, l);
			System.out.println(s);
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		finally
		{
			close(reader, is);
		}
	}

	/**
	 * 一行一行读取。
	 * 
	 * 优点：便于做读取后的算法操作，速度嘛也挺快；<br/>
	 * 缺陷:不能精确读取;<br/>
	 * 因为readLine的方法读不出’\n’,’\r\n’,所以读出来的内容其长度与实际长度有出入。
	 * 
	 * @param is
	 */
	public static void getReaderOfOneLine(InputStream is)
	{
		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
		StringBuffer sb = new StringBuffer();
		try
		{
			String line = reader.readLine();
			while (line != null)
			{
				sb.append(line);
				line = reader.readLine();
			}
			System.out.println(sb.toString());
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		finally
		{
			close(reader, is);
		}
	}

	/**
	 * 一行一行读取。
	 * 
	 * 最优
	 * 
	 * @param is
	 */
	public static void getReaderOfOneByte(InputStream is)
	{
		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
		StringBuffer sb = new StringBuffer();
		try
		{
			int temp = reader.read();
			while (temp != -1)
			{
				sb.append((char) temp);
			}
			System.out.println(sb);
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		finally
		{
			close(reader, is);
		}
	}

	private static void close(Reader reader, InputStream is)
	{
		if (is != null)
			try
			{
				is.close();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}

		if (reader != null)
			try
			{
				reader.close();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
	}

}
